import { Request, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { ErrorCode } from '@/types';
import { createApiError } from '@/utils/response';

export const handleValidationErrors = (
  req: Request,
  res: Response,
  next: NextFunction
): void => {
  const errors = validationResult(req);
  
  if (!errors.isEmpty()) {
    const apiError = createApiError(
      ErrorCode.VALIDATION_ERROR,
      'Validation failed',
      errors.array()
    );
    res.status(400).json(apiError);
    return;
  }
  
  next();
};

// 注册验证规则
export const validateRegister = [
  body('username')
    .trim()
    .isLength({ min: 2, max: 20 })
    .withMessage('用户名长度必须在2-20个字符之间')
    .matches(/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/)
    .withMessage('用户名只能包含字母、数字、下划线和中文'),
  
  body('email')
    .isEmail()
    .withMessage('请输入有效的邮箱地址')
    .normalizeEmail(),
  
  body('password')
    .isLength({ min: 6 })
    .withMessage('密码至少需要6个字符')
    .matches(/^(?=.*[a-zA-Z])(?=.*\d)/)
    .withMessage('密码必须包含至少一个字母和一个数字'),
  
  body('confirmPassword')
    .custom((value, { req }) => {
      if (value !== req.body.password) {
        throw new Error('确认密码与密码不匹配');
      }
      return true;
    }),
  
  handleValidationErrors
];

// 登录验证规则
export const validateLogin = [
  body('email')
    .isEmail()
    .withMessage('请输入有效的邮箱地址')
    .normalizeEmail(),
  
  body('password')
    .notEmpty()
    .withMessage('密码不能为空'),
  
  handleValidationErrors
];

// 修改密码验证规则
export const validateChangePassword = [
  body('currentPassword')
    .notEmpty()
    .withMessage('当前密码不能为空'),
  
  body('newPassword')
    .isLength({ min: 6 })
    .withMessage('新密码至少需要6个字符')
    .matches(/^(?=.*[a-zA-Z])(?=.*\d)/)
    .withMessage('新密码必须包含至少一个字母和一个数字'),
  
  body('confirmPassword')
    .custom((value, { req }) => {
      if (value !== req.body.newPassword) {
        throw new Error('确认密码与新密码不匹配');
      }
      return true;
    }),
  
  handleValidationErrors
];

// 会员信息验证规则
export const validateMember = [
  body('name')
    .trim()
    .isLength({ min: 2, max: 20 })
    .withMessage('姓名长度必须在2-20个字符之间'),
  
  body('phone')
    .matches(/^1[3-9]\d{9}$/)
    .withMessage('请输入有效的手机号码'),
  
  body('email')
    .optional()
    .isEmail()
    .withMessage('请输入有效的邮箱地址')
    .normalizeEmail(),
  
  body('gender')
    .isIn(['male', 'female', 'other'])
    .withMessage('性别必须是 male、female 或 other'),
  
  body('birthday')
    .optional()
    .isISO8601()
    .withMessage('请输入有效的生日日期'),
  
  body('height')
    .optional()
    .isFloat({ min: 50, max: 250 })
    .withMessage('身高必须在50-250cm之间'),
  
  body('weight')
    .optional()
    .isFloat({ min: 20, max: 300 })
    .withMessage('体重必须在20-300kg之间'),
  
  handleValidationErrors
];